//游戏的控制器，控制着其他的所有类
//引入其他的类
import snake from "./snake";
import Food from "./Food";
import Score from "./Score";
class GameControl {
    //定义三个属性
    snake:snake;
    score:Score;
    food:Food;
    //创建一个属性来储存蛇的移动方向（也就是按键方向）
    direction:string=''
    //创建一个属性来记录游戏是否结束
    islive=true
    constructor() {
        this.food=new Food()
        this.score=new Score(10,1)
        this.snake=new snake()
        this.init()
    }
    //游戏的初始化方法,调用后游戏即开始
    init(){
        //绑定键盘按下的事件  this为document，通过绑定更换this
        document.addEventListener('keydown',this.keydownHandle.bind(this))
        this.run()
    }
    //创建一个键盘按下的响应函数
    keydownHandle(event:KeyboardEvent){
        /*
        * ArrowUp
          ArrowDown
          ArrowLeft
          ArrowRight
        * */
        // console.log(event.key);
        //需要检查event.key的值是否合法（用户是否按了正确的按键）
        //修改direction属性
        this.direction=event.key
    }
    //创建一个控制蛇移动的方法
    run (){
        /*
        * 根据方向（this.direction）来使蛇的位置改变
        * 通过修改 top和left值
        * */
        let x=this.snake.X
        let y=this.snake.Y
        switch (this.direction) {
            case "ArrowUp":y-=10;break;
            case "ArrowDown":y+=10;break;
            case "ArrowLeft":x-=10;break;
            case "ArrowRight":x+=10;break;
        }
        this.checkEat(x,y)
        try{
            this.snake.X=x;
            this.snake.Y=y;
        }catch (e) {
            //当出现异常是，进行捕获
            alert(e.message+"GAME OVER!")
            //设置游戏状态
            this.islive=false
        }

        //开启一个定时调用
        this.islive&&setTimeout(this.run.bind(this),300-(this.score.level-1)*30)
    }
    //检查蛇是否吃到了食物
    checkEat(x:number,y:number){
        if(x===this.food.X&&y===this.food.Y){
            console.log("吃到食物了");
            //食物进行重置
            this.food.change()
            //分数进行增加
            this.score.addScore()
            //蛇增加了一节
            this.snake.addBody()
        }
    }
}
export default GameControl;